package bbs.service;

import bbs.exception.ServiceException;
import bbs.mapper.UserMapper;
import bbs.model.User;
import bbs.utils.Constant;
import bbs.utils.StringHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.Objects;

/**
 * @author ljg;
 * @create 2022-06-08 10:26
 */
@Service
@Transactional(rollbackFor = {RuntimeException.class, ServiceException.class})
public class UserService {

    @Autowired
    UserMapper userMapper;

    /**
     * 根据用户名 和 密码 获取到user对象
     * @param username 用户名
     * @param password 密码
     * @return 返回 null 表示没有用户名；
     *          返回 完整的 user对象 ，表示用户名密码正确
     *          返回 一个 空的 user对象表示用户名或密码错误
     *          返回user中只有id和locked的对象 表示用户被锁定
     *
     */
    public User login(String username, String password){

        try {
            User user = getUserByUserName(username) ;
            System.out.println("用户：" + user.getUserName());
            User u = new User();
            //判断
            if (Objects.isNull(user)){
                // 没有查到 user ，直接返回
                return null ;
            }else { // 接着判断 密码
                if(user.getPassword().equals(StringHelper.MD5(password) )){
                    // 密码正确
                    //接着 判断是否 被锁定
                    if(user.getLocked().equals(Constant.UNLOCKED)){
                        // 用户没有被锁定
                        //说明登录成功，增加积分，并且返回对象
                        userMapper.addCredit(user.getUserId(), user.getCredit() + 5);
                        return user ;
                    }else {// 用户被锁定，返回的user中只有 locked 和 userId
                        u.setLocked(Constant.LOCKED);
                        u.setUserId(user.getUserId());
                        return u ;
                    }
                }else {//此时 密码不正确 返回一个新的 user对象
                    return u ;
                }
            }
        } catch (Exception e) {
            throw new ServiceException(e);
        }
    }


    public User getUserByUserName(String username) {
        return userMapper.findByUsername(username) ;
    }

    /**
     *  注册
     * @param username 用户名
     * @param password 密码
     * @return 返回 一个user对象
     */
    public User register(String username, String password) {

        try {
            //注册新用户
            User user = new User();

            user.setUserName(username);
            user.setPassword(StringHelper.MD5(password));
            user.setLocked(Constant.UNLOCKED);
            user.setLastVisit(LocalDateTime.now());
            user.setCredit(100);
            user.setType(Constant.NORMAL);
            //新用户注册成功，送100积分
            int count = userMapper.insert(user);
            return count>0 ? user : null ;
        } catch (Exception e) {
            throw new ServiceException(e) ;
        }
    }

    /**
     *
     * @param id 用户id
     * @return 返回 user对象
     */
    public User findById( Integer id ){
        return userMapper.findById( id ) ;
    }

}
